from zope.app.component.hooks import getSite
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.utils import _createObjectByType

from AccessControl import Unauthorized
from AccessControl.Permissions import *
from Products.Sessions.SessionPermissions import *
from Products.CMFCore.permissions import *


from cintra.policy.utils.roles import *
from cintra.policy.utils.permissions import *


def createGroups(portal):
    """ Funcao que cria os grupos e atribui papeis aos mesmos. As constantes aqui
    utilizadas estao definidas no arquivo wres.policy.utils.roles """
    print "Creating Groups..."

    portal_groups = getToolByName(portal, 'portal_groups')
    acl_users = getToolByName(portal, 'acl_users')
#    if not acl_users.searchGroups(id='Doctors'):
#        portal_groups.addGroup('Doctors')
#        portal_groups.setRolesForGroup('Commercials', ['Commercial'])

    if not acl_users.searchGroups(id=ADMINISTRATIVO_GROUP):    
        portal_groups.addGroup(ADMINISTRATIVO_GROUP, roles = [ADMINISTRATIVO_ROLE, COLABORADOR_ROLE, AUTENTICADO_ROLE])
    
    if not acl_users.searchGroups(id=COMERCIAL_GROUP):    
        portal_groups.addGroup(COMERCIAL_GROUP, roles = [COMERCIAL_ROLE, COLABORADOR_ROLE, AUTENTICADO_ROLE, REVISOR_ROLE])
    
    if not acl_users.searchGroups(id=DESENVOLVIMENTO_GROUP):        
        portal_groups.addGroup(DESENVOLVIMENTO_GROUP, roles = [DESENVOLVIMENTO_ROLE, COLABORADOR_ROLE, AUTENTICADO_ROLE])
        
    if not acl_users.searchGroups(id=SUPORTE_GROUP):
        portal_groups.addGroup(SUPORTE_GROUP, roles = [SUPORTE_ROLE, COLABORADOR_ROLE, AUTENTICADO_ROLE, SITEADMIN_ROLE])
    
    print "Create Groups...ok"

def getOrCreateType(portal, atobj, newid, newtypeid):
    """
    Gets the object specified by newid if it already exists under
    atobj or creates it there with the id given in newtypeid
    """
    try:
        newobj = getattr(atobj,newid) #get it if it already exists
    except AttributeError:  #newobj doesn't already exist
        try:            
            _ = atobj.invokeFactory(id=newid,type_name=newtypeid)            
        except ValueError:
            _createObjectByType(newtypeid, atobj, newid)
        except Unauthorized:
            _createObjectByType(newtypeid, atobj, newid)
        newobj = getattr(atobj,newid)
    return newobj

def createAdministratisvoFolder(portal):
    """ Cria a pasta de administrativo """
    print '*** Criando pasta de administrativo...'
    administrativo_folder = getOrCreateType(portal, portal, 'Administrativo', 'AdministrativoFolder')
    administrativo_folder.manage_permission('View', [AUTENTICADO_ROLE], acquire = False)
    #administrativo_folder.manage_permission('Access contents information', [ADMINISTRATIVO_ROLE, SITEADMIN_ROLE], acquire = False)
    administrativo_folder.manage_permission('Access contents information', [AUTENTICADO_ROLE], acquire = False)
    administrativo_folder.setTitle('Administrativo')
    administrativo_folder.reindexObject()
    print '*** Criando pasta de administrativo...... OK'

def createComercialFolder(portal):
    """ Cria o objeto comercial """
    print '*** Criando pasta comercial...'
    comercial_folder = getOrCreateType(portal, portal, 'Comercial', 'ComercialFolder')
    comercial_folder.manage_permission('View', [AUTENTICADO_ROLE], acquire = False)
    #comercial_folder.manage_permission('Access contents information', [COMERCIAL_ROLE, SITEADMIN_ROLE], acquire = False)
    comercial_folder.manage_permission('Access contents information', [AUTENTICADO_ROLE], acquire = False)
    comercial_folder.setTitle('Comercial')
    comercial_folder.reindexObject()
    print '*** Criando objeto comercial...... OK'


def createDesenvolvimentoFolder(portal):
    """ Cria o objeto desenvolvimento """
    print '*** Criando pasta desenvolvimento...'
    desenvolvimento_folder = getOrCreateType(portal, portal, 'Desenvolvimento', 'DesenvolvimentoFolder')
    desenvolvimento_folder.manage_permission('View', [AUTENTICADO_ROLE], acquire = False)
    #desenvolvimento_folder.manage_permission('Access contents information', [DESENVOLVIMENTO_ROLE,SITEADMIN_ROLE], acquire = False)
    desenvolvimento_folder.manage_permission('Access contents information', [AUTENTICADO_ROLE], acquire = False)
    desenvolvimento_folder.setTitle('Desenvolvimento')
    desenvolvimento_folder.reindexObject()
    print '*** Criando objeto desenvolvimento...... OK'


def createSuporteFolder(portal):
    """ Cria o objeto suporte """
    print '*** Criando pasta suporte...'
    suporte_folder = getOrCreateType(portal, portal, 'Suporte', 'SuporteFolder')
    suporte_folder.manage_permission('View', [AUTENTICADO_ROLE], acquire = False)
    #suporte_folder.manage_permission('Access contents information', [SUPORTE_ROLE, SITEADMIN_ROLE], acquire = False)
    suporte_folder.manage_permission('Access contents information', [AUTENTICADO_ROLE], acquire = False)
    suporte_folder.setTitle('Suporte')
    suporte_folder.reindexObject()
    print '*** Criando objeto suporte...... OK'



def deleteDefaultObjects(portal):
    """ Deleta objetos de um plone site out-of-the-box """
    try:
        portal.manage_delObjects('events')
        print "Deleted Events folder"
    except AttributeError:
        print "No %s folder detected. Hmm... strange. Continuing..." % 'events'
        

def setupVarious(context):
    if context.readDataFile('cintra.policy_various.txt') is None:
        return
    
    portal = getSite()
    
    if not portal.portal_types.getTypeInfo('AdministrativoFolder'):
        print '********************************AINDA NAO***********************************'
        return
    
    print "===Cintra Policy Installed==="
    
    deleteDefaultObjects(portal)
    createAdministratisvoFolder(portal)    
    createComercialFolder(portal)
    createDesenvolvimentoFolder(portal)
    createSuporteFolder(portal)
    createGroups(portal)
